﻿using System;

namespace Viyi.Util.Data.Converter
{
    /// <summary>
    /// 用于将列的数据按指定的枚举类型，将数据转换成枚举名称。
    /// </summary>
    public class EnumColumnConverter : DataTableColumnConverter
    {
        Type enumType;

        /// <summary>
        /// 使用一个枚举类型构造<c>EnumColumnConverter</c>对象。
        /// </summary>
        /// <param name="type">枚举类型</param>
        /// <exception cref="ArgumentNullException"><c>type</c>为<c>null</c></exception>
        /// <exception cref="InvalidCastException"><c>type</c>不是一个枚举类型</exception>
        public EnumColumnConverter(Type type)
        {
            if (type == null) { throw new ArgumentNullException(nameof(type)); }
            if (!type.IsEnum) { throw new InvalidCastException($"{nameof(type)} 必须是枚举类型"); }

            enumType = type;
        }

        /// <summary>
        /// 将源列数据，按枚举值，转换为枚举名称，并置入新列。
        /// </summary>
        /// <param name="row">数据行</param>
        /// <param name="columnIndex">源列索引</param>
        /// <param name="newColumnIndex">新列索引</param>
        protected override void Convert(System.Data.DataRow row, int columnIndex, int newColumnIndex)
        {
            row[newColumnIndex] = Enum.GetName(enumType, row.ObjectValue(columnIndex, 0));
        }
    }
}
